package com.qf.test;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;

//测试shiro权限框架基本使用
public class ShiroDemo {

    public static void main(String[] args) {

        //1. 获取SecurityManager核心对象
        DefaultSecurityManager securityManager = new DefaultSecurityManager();
        //2. 获取配置文件中的权限数据, 用户数据, 角色数据
        IniRealm iniRealm = new IniRealm("classpath:shiro.ini");
        //3. 将用户, 角色, 权限数据放入SecurityManager核心对象中.
        securityManager.setRealm(iniRealm);
        //4. 设置SecurityManagerUtils核心对象工具类
        SecurityUtils.setSecurityManager(securityManager);
        //5. 得到Subject当前登录用户对象
        Subject subject = SecurityUtils.getSubject();
        //6. 登录, 封装AuthenticationToken对象, 模拟用户在页面输入的用户名密码
        AuthenticationToken token = new UsernamePasswordToken("zhangsan", "123456");
        //7. 调用login登录方法, 让shiro框架核心SecurityManager对象去验证用户输入的用户名密码和
        //配置文件或者数据库中记录的用户名, 密码是否一致. 进行权限校验

        try {
            subject.login(token);
            System.out.println("====用户登录成功！====");
            //8. 如果用户名, 密码不对, 抛出对应的异常
        } catch (UnknownAccountException e){
            System.out.println("======用户名错误======");
        }catch (IncorrectCredentialsException e){
            System.out.println("======密码错误=======");
        }
        catch (AuthenticationException e) {
            System.out.println("=====其他未知异常======");
        }
        //9. 如果用户名密码正确, 获取, 用户, 角色, 权限等框架中能够获取到的用户信息打印, 登录成功
        System.out.println("=========登录后判断用户角色========");
        System.out.println("=========判断用户是否为管理员角色========" + subject.hasRole("admin"));
        System.out.println("=========判断用户是否为开发者角色========" + subject.hasRole("developer"));
        System.out.println("=========判断用户是否为xxx角色========" + subject.hasRole("xxx"));

        System.out.println("=========登录后判断用户权限========");
        System.out.println("=========登录后判断用户添加操作权限========" + subject.isPermitted("sys:user:add"));
        System.out.println("=========登录后判断用户删除操作权限========" + subject.isPermitted("sys:user:del"));
        System.out.println("=========登录后判断菜单添加操作权限========" + subject.isPermitted("sys:menu:add"));
        System.out.println("=========登录后判断菜单删除操作权限========" + subject.isPermitted("sys:menu:del"));


    }
}
